{
  "name": "Case 66 - Single Store Review Analysis (Student-Friendly)",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 9
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -896,
        -480
      ],
      "id": "923b3de6-8742-4fba-8ca9-2b03c9ab073d",
      "name": "Weekly Schedule - Monday 9 AM"
    },
    {
      "parameters": {
        "actorId": {
          "__rl": true,
          "value": "Xb8osYTtOjlsgI6k9",
          "mode": "id",
          "cachedResultName": "Google Maps Scraper"
        },
        "customBody": "{\n  \"language\": \"en\",\n  \"maxReviews\": 100,\n  \"personalData\": true,\n  \"startUrls\": [\n    {\n      \"url\": \"https://www.google.com/maps?cid=7231903711028778805\"\n    }\n  ],\n  \"reviewsSort\": \"newest\",\n  \"reviewsOrigin\": \"all\"\n}"
      },
      "type": "@apify/n8n-nodes-apify.apify",
      "typeVersion": 1,
      "position": [
        -704,
        -480
      ],
      "id": "df5d2ef7-a9c4-461d-a238-4de2e1007c83",
      "name": "Scrape Starbucks Reviews",
      "credentials": {
        "apifyApi": {
          "id": "w5S6YBbbyUddEfQA",
          "name": "Apify account"
        }
      }
    },
    {
      "parameters": {
        "resource": "Datasets",
        "datasetId": "={{ $json.defaultDatasetId }}",
        "limit": 100
      },
      "type": "@apify/n8n-nodes-apify.apify",
      "typeVersion": 1,
      "position": [
        -512,
        -480
      ],
      "id": "f7c7e5b0-a92e-436c-af4a-276650aaa76b",
      "name": "Get Dataset Items",
      "credentials": {
        "apifyApi": {
          "id": "w5S6YBbbyUddEfQA",
          "name": "Apify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 1
          },
          "conditions": [
            {
              "id": "filter-1star",
              "leftValue": "={{ $json.stars }}",
              "rightValue": 1,
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            },
            {
              "id": "filter-2star",
              "leftValue": "={{ $json.stars }}",
              "rightValue": 2,
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "or"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2,
      "position": [
        -320,
        -480
      ],
      "id": "13fc6caa-a153-4adb-82e4-e893cc5335d4",
      "name": "Filter 1-2 Star Reviews"
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "gpt-4o",
          "mode": "list",
          "cachedResultName": "GPT-4o"
        },
        "responses": {
          "values": [
            {
              "role": "system",
              "content": "=You are a Starbucks complaint analyst. Read the review carefully and categorize it.\n\nReturn ONLY this JSON format:\n{\n  \"complaint_category\": \"Service Quality|Product Issues|Staff Behavior|Cleanliness|Pricing|Wait Time|Other\",\n  \"severity\": \"critical|high|medium|low\",\n  \"emotional_tone\": \"Angry|Frustrated|Disappointed|Calm|Sarcastic\",\n  \"specific_issue\": \"what went wrong\",\n  \"key_quote\": \"most important sentence from review\"\n}\n\nHOW TO CATEGORIZE:\n\nStaff Behavior = Customer complains about HOW staff treated them\nKeywords: rude, arrogant, disrespectful, mean, attitude, unprofessional, dismissive\nExample: \"Staff was extremely rude\" → Staff Behavior\n\nProduct Issues = Food or drink quality problem\nKeywords: cold coffee, wrong order, tasted bad, burnt, stale, horrible food\nExample: \"Coffee was cold and tasted burnt\" → Product Issues\n\nWait Time = Too long to get order\nKeywords: waited 30 minutes, slow service, long line, took forever\nExample: \"Waited 25 minutes for a latte\" → Wait Time\n\nService Quality = Staff forgot/ignored you BUT weren't rude\nKeywords: forgot order, ignored me, no one helped, poor service\nExample: \"They forgot my order\" → Service Quality\n\nCleanliness = Dirty store or bathroom\nKeywords: dirty, filthy, bathroom disgusting, trash everywhere\nExample: \"Tables were filthy\" → Cleanliness\n\nPricing = Too expensive or wrong charge\nKeywords: overpriced, expensive, charged wrong amount\nExample: \"Way too expensive\" → Pricing\n\nOther = Doesn't fit above categories\nExample: \"No parking\" → Other\n\nSEVERITY RULES:\n- If customer uses words like \"worst\", \"terrible\", \"horrible\", \"disgusting\" → high\n- If customer is complaining but not using extreme words → medium\n- If customer is just giving feedback → low\n- If there's safety/health issue → critical\n\nEMOTIONAL TONE RULES:\n- Angry = uses words like \"furious\", \"outraged\", profanity, \"never coming back\"\n- Frustrated = complains multiple times, uses \"disappointed\", \"ridiculous\"\n- Disappointed = sad, unmet expectations, \"expected better\"\n- Calm = neutral feedback, no emotion\n- Sarcastic = uses mockery or irony\n\nLook at the ACTUAL WORDS in the review. If customer says \"extremely rude staff\" - that's Staff Behavior and Angry tone. If customer says \"waited 28 minutes\" - that's Wait Time and Frustrated tone.\n\nReturn ONLY the JSON. No explanation."
            },
            {
              "content": "=Analyze this Starbucks review:\n\nLocation: {{ $json.title }}\nReviewer: {{ $json.name }}\nRating: {{ $json.stars }} stars\nDate: {{ $json.publishedAtDate }}\nReview Text: {{ $json.text }}\n\nReturn only JSON."
            }
          ]
        },
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 2.1,
      "position": [
        -128,
        -480
      ],
      "id": "46125e29-e252-43c6-badb-b6aebc615168",
      "name": "AI: Analyze Review",
      "credentials": {
        "openAiApi": {
          "id": "ICwxUBbatsF2sDvy",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// STANDARD AI RESPONSE PARSER\n// Use this after every AI node to convert text into drag-droppable fields\n// Students: You don't need to understand this code - just connect it after AI nodes!\n\nconst items = [];\nconst input = $input.all();\n\ninput.forEach((item, index) => {\n  try {\n    // Get AI response text\n    const aiText = item.json.output[0].content[0].text;\n    \n    // Clean markdown code blocks if present\n    const cleaned = aiText.replace(/```json\\n?/g, '').replace(/```\\n?/g, '').trim();\n    \n    // Parse JSON string into object\n    const parsed = JSON.parse(cleaned);\n    \n    // Return parsed fields (now you can drag-drop these!)\n    items.push({\n      json: parsed\n    });\n  } catch (error) {\n    console.error(`Error parsing AI response for item ${index}:`, error.message);\n    // Return empty fields if parsing fails\n    items.push({\n      json: {\n        complaint_category: 'Other',\n        severity: 'low',\n        emotional_tone: 'Calm',\n        specific_issue: `Parse error: ${error.message}`,\n        key_quote: ''\n      }\n    });\n  }\n});\n\nreturn items;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        144,
        -480
      ],
      "id": "4db14531-957d-42d1-b956-59863483b8e0",
      "name": "Parse AI Response"
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "1vXI0FGEsf-2erDpxJE2WxeOwwticAX-MZGN3-d9SWqo",
          "mode": "list",
          "cachedResultName": "Case 66 - simplified"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Sheet1"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Review_Date": "={{ $json.review_date }}",
            "Reviewer_Name": "={{ $json.reviewer_name }}",
            "Star_Rating": "={{ $json.star_rating }}",
            "Review_Text": "={{ $json.review_text }}",
            "Complaint_Category": "={{ $json.complaint_category }}",
            "Severity": "={{ $json.severity }}",
            "Emotional_Tone": "={{ $json.emotional_tone }}",
            "Specific_Issue": "={{ $json.specific_issue }}",
            "Key_Quote": "={{ $json.key_quote }}",
            "Review_URL": "={{ $json.review_url }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "Review_Date",
              "displayName": "Review_Date",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Reviewer_Name",
              "displayName": "Reviewer_Name",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Star_Rating",
              "displayName": "Star_Rating",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Review_Text",
              "displayName": "Review_Text",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Complaint_Category",
              "displayName": "Complaint_Category",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Severity",
              "displayName": "Severity",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Emotional_Tone",
              "displayName": "Emotional_Tone",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Specific_Issue",
              "displayName": "Specific_Issue",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Key_Quote",
              "displayName": "Key_Quote",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Review_URL",
              "displayName": "Review_URL",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        448,
        -480
      ],
      "id": "2ec62baa-3912-4e80-92ca-174171be4ac5",
      "name": "Log to Google Sheet",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "LOs2dbk9lby0NfDM",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Aggregate negative review data for email summary\nconst items = $('Edit Fields1').all();\n\nif (items.length === 0) {\n  return [{\n    json: {\n      total_negative_reviews: 0,\n      category_breakdown: {},\n      severity_breakdown: {},\n      emotional_tone_breakdown: {},\n      top_issues: [],\n      location_name: 'Unknown'\n    }\n  }];\n}\n\n// Count by category\nconst categoryCount = {};\nconst severityCount = {};\nconst emotionalToneCount = {};\nconst allIssues = [];\nconst location_name = items[0].json.location_name || 'Unknown';\n\nitems.forEach(item => {\n  const data = item.json;\n  \n  // Category breakdown\n  const category = data.complaint_category || 'Other';\n  categoryCount[category] = (categoryCount[category] || 0) + 1;\n  \n  // Severity breakdown\n  const severity = data.severity || 'low';\n  severityCount[severity] = (severityCount[severity] || 0) + 1;\n  \n  // Emotional tone breakdown\n  const tone = data.emotional_tone || 'Calm';\n  emotionalToneCount[tone] = (emotionalToneCount[tone] || 0) + 1;\n  \n  // Collect issues for top issues list\n  allIssues.push({\n    issue: data.specific_issue || '',\n    quote: data.key_quote || '',\n    reviewer: data.reviewer_name || 'Anonymous',\n    date: data.review_date || '',\n    rating: data.star_rating || 0,\n    url: data.review_url || '',\n    severity: data.severity || 'low',\n    category: data.complaint_category || 'Other'\n  });\n});\n\n// Sort issues by severity (critical > high > medium > low)\nconst severityOrder = { critical: 4, high: 3, medium: 2, low: 1 };\nallIssues.sort((a, b) => {\n  return (severityOrder[b.severity] || 0) - (severityOrder[a.severity] || 0);\n});\n\n// Get top 5 issues\nconst topIssues = allIssues.slice(0, 5);\n\nreturn [{\n  json: {\n    total_negative_reviews: items.length,\n    category_breakdown: categoryCount,\n    severity_breakdown: severityCount,\n    emotional_tone_breakdown: emotionalToneCount,\n    top_issues: topIssues,\n    location_name: location_name\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        640,
        -480
      ],
      "id": "a534e941-e232-472d-88cb-fe198a504e85",
      "name": "Aggregate Summary"
    },
    {
      "parameters": {
        "sendTo": "manager@starbucks.com",
        "subject": "=Weekly Review Summary - {{ $json.location_name }}",
        "message": "=<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; background: #f5f5f5; margin: 0; padding: 0; }\n    .container { max-width: 700px; margin: 20px auto; background: white; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.15); }\n    .header { background: linear-gradient(135deg, #00704A 0%, #00422A 100%); color: white; padding: 30px; text-align: center; }\n    .header h1 { margin: 0 0 10px 0; font-size: 26px; }\n    .header .subtitle { font-size: 18px; opacity: 0.95; margin-top: 5px; }\n    .content { padding: 30px; }\n    .stats-section { margin: 25px 0; }\n    .stats-section h3 { color: #00704A; border-bottom: 2px solid #00704A; padding-bottom: 10px; margin-bottom: 15px; }\n    .stat-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin: 15px 0; }\n    .stat-box { background: #f8f9fa; padding: 15px; border-radius: 8px; text-align: center; border: 1px solid #dee2e6; }\n    .stat-number { font-size: 28px; font-weight: bold; color: #d32f2f; margin: 0; }\n    .stat-label { font-size: 13px; color: #666; margin-top: 5px; }\n    .breakdown-item { background: #f8f9fa; padding: 12px 15px; margin: 8px 0; border-radius: 5px; display: flex; justify-content: space-between; align-items: center; }\n    .breakdown-label { font-weight: 500; color: #333; }\n    .breakdown-count { background: #00704A; color: white; padding: 4px 12px; border-radius: 15px; font-size: 14px; font-weight: bold; }\n    .issue-card { background: #fff3cd; padding: 15px; margin: 12px 0; border-radius: 8px; border-left: 4px solid #ffc107; }\n    .issue-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }\n    .issue-category { background: #00704A; color: white; padding: 4px 10px; border-radius: 12px; font-size: 12px; font-weight: bold; }\n    .issue-severity { padding: 4px 10px; border-radius: 12px; font-size: 12px; font-weight: bold; }\n    .severity-critical { background: #d32f2f; color: white; }\n    .severity-high { background: #ff6f00; color: white; }\n    .severity-medium { background: #ffa726; color: white; }\n    .severity-low { background: #66bb6a; color: white; }\n    .issue-text { color: #555; font-style: italic; margin: 8px 0; }\n    .issue-quote { background: white; padding: 10px; border-left: 3px solid #ffc107; margin: 8px 0; font-size: 14px; color: #666; }\n    .issue-reviewer { font-size: 13px; color: #666; margin-top: 8px; }\n    .recommendations { background: #e8f5e9; padding: 20px; margin: 25px 0; border-radius: 8px; border: 2px solid #00704A; }\n    .recommendations h3 { color: #00704A; margin-top: 0; }\n    .recommendations ul { margin: 10px 0; padding-left: 25px; line-height: 1.8; }\n    .footer { background: #f5f5f5; padding: 20px; text-align: center; color: #666; font-size: 12px; border-top: 1px solid #ddd; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h1>📊 Weekly Review Summary</h1>\n      <div class=\"subtitle\">{{ $json.location_name }}</div>\n    </div>\n    \n    <div class=\"content\">\n      <div class=\"stats-section\">\n        <h3>📉 Negative Reviews Overview</h3>\n        <div class=\"stat-grid\">\n          <div class=\"stat-box\">\n            <div class=\"stat-number\">{{ $json.total_negative_reviews }}</div>\n            <div class=\"stat-label\">Total Negative Reviews</div>\n          </div>\n          <div class=\"stat-box\">\n            <div class=\"stat-number\">{{ Object.keys($json.category_breakdown).length }}</div>\n            <div class=\"stat-label\">Issue Categories</div>\n          </div>\n        </div>\n      </div>\n      \n      <div class=\"stats-section\">\n        <h3>🗂️ Complaint Categories</h3>\n        {{ Object.keys($json.category_breakdown).map(cat => `\n        <div class=\"breakdown-item\">\n          <span class=\"breakdown-label\">${cat}</span>\n          <span class=\"breakdown-count\">${$json.category_breakdown[cat]}</span>\n        </div>\n        `).join('') }}\n      </div>\n      \n      <div class=\"stats-section\">\n        <h3>⚠️ Severity Breakdown</h3>\n        {{ Object.keys($json.severity_breakdown).map(sev => `\n        <div class=\"breakdown-item\">\n          <span class=\"breakdown-label\">${sev.charAt(0).toUpperCase() + sev.slice(1)}</span>\n          <span class=\"breakdown-count\">${$json.severity_breakdown[sev]}</span>\n        </div>\n        `).join('') }}\n      </div>\n      \n      <div class=\"stats-section\">\n        <h3>😤 Emotional Tone Analysis</h3>\n        {{ Object.keys($json.emotional_tone_breakdown).map(tone => `\n        <div class=\"breakdown-item\">\n          <span class=\"breakdown-label\">${tone}</span>\n          <span class=\"breakdown-count\">${$json.emotional_tone_breakdown[tone]}</span>\n        </div>\n        `).join('') }}\n      </div>\n      \n      <div class=\"stats-section\">\n        <h3>🔥 Top Priority Issues</h3>\n        {{ $json.top_issues.map(issue => `\n        <div class=\"issue-card\">\n          <div class=\"issue-header\">\n            <span class=\"issue-category\">${issue.category}</span>\n            <span class=\"issue-severity severity-${issue.severity}\">${issue.severity.toUpperCase()}</span>\n          </div>\n          <div class=\"issue-text\"><strong>Issue:</strong> ${issue.issue}</div>\n          <div class=\"issue-quote\">\"${issue.quote}\"</div>\n          <div class=\"issue-reviewer\">— ${issue.reviewer} | ⭐ ${issue.rating}/5 | ${issue.date}</div>\n          <a href=\"${issue.url}\" target=\"_blank\" style=\"color: #00704A; font-size: 13px; text-decoration: none;\">→ View Full Review</a>\n        </div>\n        `).join('') }}\n      </div>\n      \n      <div class=\"recommendations\">\n        <h3>💡 Recommended Actions</h3>\n        <ul>\n          <li><strong>Immediate Review:</strong> Address all critical and high-severity complaints within 24 hours</li>\n          <li><strong>Staff Training:</strong> Focus on top complaint categories identified above</li>\n          <li><strong>Customer Outreach:</strong> Consider reaching out to highly dissatisfied customers</li>\n          <li><strong>Process Improvement:</strong> Analyze patterns and implement corrective measures</li>\n          <li><strong>Follow-up:</strong> Monitor next week's reviews to track improvement</li>\n        </ul>\n      </div>\n    </div>\n    \n    <div class=\"footer\">\n      <p><strong>Automated Weekly Review Analysis</strong></p>\n      <p>Generated on {{ new Date().toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }) }}</p>\n      <p>This is an automated report. Please do not reply to this email.</p>\n    </div>\n  </div>\n</body>\n</html>",
        "options": {}
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        832,
        -480
      ],
      "id": "2cc51d26-05a9-45f1-b678-fce163137f74",
      "name": "Send Weekly Summary Email",
      "webhookId": "7983c593-d33e-4fce-b261-57c150fc3d95",
      "credentials": {
        "gmailOAuth2": {
          "id": "cyqCGWcggZNMcSOv",
          "name": "Gmail account"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cat",
              "name": "complaint_category",
              "value": "={{ $json.complaint_category }}",
              "type": "string"
            },
            {
              "id": "sev",
              "name": "severity",
              "value": "={{ $json.severity }}",
              "type": "string"
            },
            {
              "id": "tone",
              "name": "emotional_tone",
              "value": "={{ $json.emotional_tone }}",
              "type": "string"
            },
            {
              "id": "issue",
              "name": "specific_issue",
              "value": "={{ $json.specific_issue }}",
              "type": "string"
            },
            {
              "id": "quote",
              "name": "key_quote",
              "value": "={{ $json.key_quote }}",
              "type": "string"
            },
            {
              "id": "date",
              "name": "review_date",
              "value": "={{ $('Filter 1-2 Star Reviews').item.json.publishedAtDate }}",
              "type": "string"
            },
            {
              "id": "reviewer",
              "name": "reviewer_name",
              "value": "={{ $('Filter 1-2 Star Reviews').item.json.name }}",
              "type": "string"
            },
            {
              "id": "rating",
              "name": "star_rating",
              "value": "={{ $('Filter 1-2 Star Reviews').item.json.stars }}",
              "type": "number"
            },
            {
              "id": "text",
              "name": "review_text",
              "value": "={{ $('Filter 1-2 Star Reviews').item.json.textTranslated || $('Filter 1-2 Star Reviews').item.json.text }}",
              "type": "string"
            },
            {
              "id": "url",
              "name": "review_url",
              "value": "={{ $('Filter 1-2 Star Reviews').item.json.reviewUrl }}",
              "type": "string"
            },
            {
              "id": "loc",
              "name": "location_name",
              "value": "={{ $('Filter 1-2 Star Reviews').item.json.title }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        304,
        -480
      ],
      "id": "a01e4866-8191-4526-b13c-15f64be9cb3a",
      "name": "Edit Fields1"
    }
  ],
  "pinData": {},
  "connections": {
    "Weekly Schedule - Monday 9 AM": {
      "main": [
        [
          {
            "node": "Scrape Starbucks Reviews",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Starbucks Reviews": {
      "main": [
        [
          {
            "node": "Get Dataset Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Dataset Items": {
      "main": [
        [
          {
            "node": "Filter 1-2 Star Reviews",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter 1-2 Star Reviews": {
      "main": [
        [
          {
            "node": "AI: Analyze Review",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI: Analyze Review": {
      "main": [
        [
          {
            "node": "Parse AI Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse AI Response": {
      "main": [
        [
          {
            "node": "Edit Fields1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Google Sheet": {
      "main": [
        [
          {
            "node": "Aggregate Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Summary": {
      "main": [
        [
          {
            "node": "Send Weekly Summary Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        [
          {
            "node": "Log to Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "cb81cc67-1a85-47d9-9d67-924e87c26434",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "3a43da28588548e21903e71cf1dc3ddd65c24bf0c62e7e4b77542ffe87ad79c6"
  },
  "id": "wyeY6Ji6eiFclEVy",
  "tags": []
}